﻿using AppCommerciaux.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AppCommerciaux.ViewModels
{
    public class LigneCommandeEditViewModel : ViewModelBase
    {
        private commandeclient _selectedCommande;
        public LigneCommandeEditViewModel(string etat, commandeclient selectedCommande)
        {
            try
            {
                this._selectedCommande = selectedCommande;
                this.SelectedLigneCommande = new lignecommandeclient();
                this.SelectedProduit = new produit();

                using (Entity.liv3Entities1 dc = new Entity.liv3Entities1())
                {
                    ListProduit = dc.produit.ToList();
                    foreach (produit pro in ListProduit)
                    {
                        pro.tva = dc.tva.Where(t => t.id == pro.id_tva).FirstOrDefault();
                        pro.unite = dc.unite.Where(t => t.id == pro.id_unite).FirstOrDefault();
                        produit p = dc.produit.Where(pr => pr.id == pro.id).FirstOrDefault();
                        pro.stock_en_cours = p.stock_en_cours;      
                    }
                }
                this.Etat = etat;
                this.Titre = "LigneCommandeEditView en " + Etat + " pour la commande n°" + selectedCommande.id;

                if (Etat == "Ajout")
                {
                    this.SelectedLigneCommande.quantite = 0;
                    if (ListProduit != null)
                    {
                        this.SelectedProduit = ListProduit.FirstOrDefault();
                        this.SelectedLigneCommande.totalHT = this.SelectedLigneCommande.GetTotalHT();
                        this.SelectedLigneCommande.totalTTC = this.SelectedLigneCommande.GetTotalTTC();

                    }
                }
                else if (Etat == "AjoutDepuisCreationCommande")
                {
                    if (ListProduit != null)
                    {
                        this.SelectedProduit = ListProduit.FirstOrDefault();
                    }
                    this.SelectedLigneCommande.quantite = 0;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #region Declaration

        private lignecommandeclient _selectedLigneCommande;
        public lignecommandeclient SelectedLigneCommande
        {
            get { return _selectedLigneCommande; }
            set
            {
                if (_selectedLigneCommande != value)
                {
                    _selectedLigneCommande = value;
                    OnPropertyChanged("SelectedLigneCommande");
                }
            }
        }

        private produit _selectedProduit;
        public produit SelectedProduit
        {
            get
            {  return _selectedProduit; }
            set
            {

                if (_selectedProduit != value)
                {
                    _selectedProduit = value;
                    SelectedLigneCommande.produit=value;
                    try
                    {
                        using (Entity.liv3Entities1 dc = new Entity.liv3Entities1())
                        {
                            this.SelectedLigneCommande.produit.tva = dc.tva.Where(t => t.id == SelectedLigneCommande.produit.id_tva).FirstOrDefault();
                            this.SelectedLigneCommande.produit.unite = dc.unite.Where(t => t.id == SelectedLigneCommande.produit.id_unite).FirstOrDefault();
                        }
                    }
                    catch (Exception ex)
                    {
                        //MessageBox.Show(ex.Message);
                    }
                    OnPropertyChanged("SelectedProduit");
                    OnPropertyChanged("SelectedLigneCommande");
                }
            }
        }

        private string _etat;
        public string Etat
        {
            get { return _etat; }
            set
            {
                if (_etat != value)
                {
                    _etat = value;
                    OnPropertyChanged("Etat");
                }
            }
        }

        private string _titre;
        public string Titre
        {
            get { return _titre; }
            set
            {
                if (_titre != value)
                {
                    _titre = value;
                    OnPropertyChanged("Titre");
                }
            }
        }

        private List<produit> _listProduit;
        public List<produit> ListProduit
        {
            get { return _listProduit; }
            set
            {
                if (_listProduit != value)
                {
                    _listProduit = value;
                    OnPropertyChanged("ListProduit");
                }
            }
        }

        #endregion

        #region Commande
        private RelayCommand _boutonRetour;
        public RelayCommand BoutonRetour
        {
            get
            {
                if (_boutonRetour == null)
                {
                    _boutonRetour = new RelayCommand(() => Retour());
                }
                return _boutonRetour;
            }
        }
        private RelayCommand _boutonOk;
        public RelayCommand BoutonOk
        {
            get
            {
                if (_boutonOk == null)
                {
                    _boutonOk = new RelayCommand(() => Valider());
                }
                return _boutonOk;
            }
        }
        
        #endregion

        #region Methodes

        private long getNewIdLigneCommande()
        {
            long result = 0;
            lignecommandeclient LastLigneCommande = new lignecommandeclient();
            if (_selectedCommande.ListNewLigneCommande.Any())
            {
                LastLigneCommande = _selectedCommande.ListNewLigneCommande.OrderByDescending(lcc => lcc.id).FirstOrDefault();
                result = LastLigneCommande.id + 1;
            }
            else
            {
                using (Entity.liv3Entities1 dc = new Entity.liv3Entities1())
                {
                    LastLigneCommande = dc.lignecommandeclient.OrderByDescending(lcc => lcc.id).FirstOrDefault();
                    result = LastLigneCommande.id + 1;
                }
            }
            return result;
        }

        private void Valider()
        {
            try
            {
                SelectedLigneCommande.id = getNewIdLigneCommande();
                SelectedLigneCommande.id_commandeclient = _selectedCommande.id;
                SelectedLigneCommande.id_produit = SelectedLigneCommande.produit.id;
                SelectedLigneCommande.puHT = (decimal)SelectedLigneCommande.produit.pu;
                SelectedLigneCommande.tauxTva = (decimal)SelectedLigneCommande.produit.tva.Taux;
                SelectedLigneCommande.totalHT = SelectedLigneCommande.GetTotalHT();
                SelectedLigneCommande.totalTTC = SelectedLigneCommande.GetTotalTTC();

                if (Etat == "Ajout")
                {
                        //ajout du selected commande
                        using (Entity.liv3Entities1 dc = new Entity.liv3Entities1())
                        {
                            string newSynchro = SelectedLigneCommande.synchro;
                            if ((_selectedCommande.synchro == "N") || (_selectedCommande.synchro == "D"))
                            {
                                newSynchro = "";
                            }
                            else
                            {
                                newSynchro = "N";
                            }
                            Entity.lignecommandeclient myLigneCommandeclient = new Entity.lignecommandeclient
                            {
                                id = SelectedLigneCommande.id,
                                quantite = SelectedLigneCommande.quantite,
                                puHT = SelectedLigneCommande.puHT,
                                tauxTva = SelectedLigneCommande.tauxTva,
                                totalHT = SelectedLigneCommande.totalHT,
                                totalTTC = SelectedLigneCommande.totalTTC,
                                id_commandeclient = _selectedCommande.id,
                                id_produit = SelectedLigneCommande.id_produit,
                                synchro = newSynchro
                            };
                            dc.lignecommandeclient.Add(myLigneCommandeclient);
                            dc.SaveChanges();
                            MessageBox.Show("Ligne de commande " + SelectedLigneCommande.id + " ajoutée !");
                        }
                    Retour();
                }
                else if (Etat == "AjoutDepuisCreationCommande")
                {
                    _selectedCommande.ListNewLigneCommande.Add(SelectedLigneCommande);
                    App.Apv.LoadEditCommandeClientView("AjoutDepuisCreationCommande", _selectedCommande);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
                
        }

        private void Retour()
        {
            if (Etat == "Ajout")
            {
                App.Apv.LoadEditCommandeClientView("Modification", _selectedCommande);
            }
            else if (Etat == "AjoutDepuisCreationCommande")
            {
                App.Apv.QuitLigneCommandeEditPage();
            }
        }
        
        #endregion

    }
}
